﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModelInterface.h"
#include "WeakReferenceable.h"

namespace gcmp
{
    class IDocument;
    class IElement;
    class IExternalParameterDefinition;
    class IExternalParameterDefinitionBinding;
    class IExternalParameterDefinitionItem;
    class IParameter;
    class IParameterValueList;
    class UniIdentity;
    enum class ExternalParameterType;

    /// \brief 外部参数定义管理类。
    class GCMP_MODEL_INTERFACE_EXPORT IExternalParameterDefinitionManager : public WeakReferenceable
    {
        DEFINE_CAST_BASE(gcmp::IExternalParameterDefinitionManager)
    public:
        /// \brief 获取文档中唯一的外部参数定义管理类对象，如果没有返回nullptr。
        ///
        /// \param pDocument 给定的文档对象
        /// \return 文档中唯一的外部参数定义管理类对象
        static const IExternalParameterDefinitionManager* Get(const IDocument* pDocument);

        /// \brief 获取文档中唯一的外部参数定义管理类对象，如果不存在会新建一个。
        ///
        /// \param pDocument 给定的文档对象
        /// \return 文档中唯一的外部参数定义管理类对象
        static IExternalParameterDefinitionManager* GetFW(IDocument * pDocument);

        /// \brief 根据外部文件参数定义项创建外部参数定义
        ///
        /// \param pItem 外部文件参数定义项
        /// \return 创建出来的外部参数定义
        virtual IExternalParameterDefinition* CreateExternalParameterDefinition(const IExternalParameterDefinitionItem* pItem) = 0;

        /// \brief 创建一个自定义外部参数定义
        ///
        /// \param uid 参数Id
        /// \param name 参数名称
        /// \param groupName 参数分组名称
        /// \param description 参数描述信息
        /// \param paramType 参数类型
        /// \param userVisible 是否用户可见
        /// \param userModifiable 是否用户可修改
        /// \param valueList 值列表
        /// \return 创建出来的外部参数定义
        virtual IExternalParameterDefinition* CreateExternalParameterDefinition(const UniIdentity& uid, const std::wstring& name, const std::wstring& groupName, const std::wstring& description, ExternalParameterType paramType, bool userVisible, bool userModifiable, gcmp::OwnerPtr<gcmp::IParameterValueList> valueList = nullptr) = 0;

        /// \brief 获取所有的外部参数定义
        /// \return 所有的外部参数定义
        virtual std::vector<const IExternalParameterDefinition*> GetAllExternalParameterDefinitions() const = 0;

        /// \brief 根据uid获取外部参数定义。
        ///
        /// \param uid 参数定义uid
        /// \return 外部参数定义
        virtual const IExternalParameterDefinition* GetExternalParameterDefinitionByUid(const UniIdentity& uid) const = 0;

        /// \brief 根据Id获取外部参数定义。
        ///
        /// \param parameterDefinitionId 参数定义Id
        /// \return 外部参数定义
        virtual const IExternalParameterDefinition* GetExternalParameterDefinitionById(int parameterDefinitionId) const = 0;

        /// \brief 获取类别绑定的所有参数定义Id。
        ///
        /// \param categoryUid 类别的唯一标识
        /// \return 类别绑定的所有参数定义Id
        virtual const std::vector<int>& GetExternalParameterDefinitionIdsOfCategory(const UniIdentity& categoryUid) const = 0;

        /// \brief 绑定参数定义。
        ///
        /// \param parameterDefinitionId 参数定义Id
        /// \param pBinding 外部参数定义绑定对象
        /// \return void
        virtual void Bind(int parameterDefinitionId, const IExternalParameterDefinitionBinding* pBinding) = 0;

        /// \brief 解绑参数定义。
        ///
        /// \param parameterDefinitionId 参数定义Id
        /// \return void
        virtual void Unbind(int parameterDefinitionId) = 0;

        /// \brief 获取给定图元对象绑定的外部参数定义。
        ///
        /// \param pElement 需要报告的图元对象
        /// \param parameterDefinitionIds 需要返回的外部参数定义列表
        /// \return void
        virtual void ReportParameterDefinitions(const IElement* pElement, std::vector<int>& parameterDefinitionIds) const = 0;

        /// \brief 判断图元是否绑定了指定的参数定义。
        ///
        /// \param pElement 给定的图元
        /// \param parameterDefinitionId 参数定义Id
        /// \return true绑定了指定的参数定义，false没有绑定
        virtual bool HasParameterById(const IElement* pElement, int parameterDefinitionId) const = 0;

        /// \brief 获取图元绑定的指定参数定义Id上的参数。
        ///
        /// \param pElement 给定的图元
        /// \param parameterDefinitionId 参数定义Id
        /// \param 参数对象
        virtual OwnerPtr<IParameter> GetParameterById(const IElement* pElement, int parameterDefinitionId) const = 0;
    };
}

